﻿using System;
using System.Collections.Generic;
using SqlParameter = System.Data.SqlClient.SqlParameter;
using SqlDbType = System.Data.SqlDbType;
using IDataReader = System.Data.IDataReader;
using System.Security.Cryptography;

namespace GamePlusClassLibrary
{
    public class Usuario
    {
        public int? Idf_Usuario { get; set; }
        public string Nme_Usuario { get; set; }
        public string Des_Login { get; set; }
        public string Des_Senha { get; set; }
        public bool Flg_Masculino { get; set; }
        public bool Flg_Receber_Notificacao { get; set; }
        public DateTime Dta_Nascimento { get; set; }
        public DateTime Dta_Cadastro { get; set; }
        public DateTime Dta_Alteracao { get; set; }
        public bool Flg_Ativo { get; set; }
        public Int16 Qtd_Convites { get; set; }
        public DateTime Dta_Ultimo_Login { get; set; }
        public Int16 Num_Tema { get; set; }
        public string Num_IP { get; set; }
        public int Idf_Usuario_Nivel { get; set; }
        public string Des_Mensagem_Pessoal { get; set; }

        public void Salvar()
        {
            List<SqlParameter> param = new List<SqlParameter>();
            param.Add(new SqlParameter("@Idf_Usuario", SqlDbType.Int));
            param.Add(new SqlParameter("@Nme_Usuario", SqlDbType.VarChar));
            param.Add(new SqlParameter("@Des_Login", SqlDbType.VarChar));
            param.Add(new SqlParameter("@Des_Senha", SqlDbType.VarChar));
            param.Add(new SqlParameter("@Flg_Masculino", SqlDbType.Bit));
            param.Add(new SqlParameter("@Flg_Receber_Notificacao", SqlDbType.Bit));
            param.Add(new SqlParameter("@Dta_Nascimento", SqlDbType.DateTime));
            param.Add(new SqlParameter("@Dta_Cadastro", SqlDbType.DateTime));
            param.Add(new SqlParameter("@Dta_Alteracao", SqlDbType.DateTime));
            param.Add(new SqlParameter("@Flg_Ativo", SqlDbType.Bit));
            param.Add(new SqlParameter("@Qtd_Convites", SqlDbType.TinyInt));
            param.Add(new SqlParameter("@Dta_Ultimo_Login", SqlDbType.DateTime));
            param.Add(new SqlParameter("@Num_Tema", SqlDbType.TinyInt));
            param.Add(new SqlParameter("@Num_IP", SqlDbType.VarChar));
            param.Add(new SqlParameter("@Idf_Usuario_Nivel", SqlDbType.VarChar));
            param.Add(new SqlParameter("@Des_Mensagem_Pessoal", SqlDbType.VarChar));

            param[0].Value = DBNull.Value;
            param[1].Value = this.Nme_Usuario;
            param[2].Value = this.Des_Login;
            param[3].Value = MD5Hash(this.Des_Senha).ToLower().Replace("-","");
            param[4].Value = this.Flg_Masculino;
            param[5].Value = this.Flg_Receber_Notificacao;
            param[6].Value = this.Dta_Nascimento;
            param[7].Value = this.Dta_Cadastro;
            param[8].Value = this.Dta_Alteracao;
            param[9].Value = this.Flg_Ativo;
            param[10].Value = this.Qtd_Convites;
            param[11].Value = this.Dta_Ultimo_Login;
            param[12].Value = this.Num_Tema;
            param[13].Value = this.Num_IP;
            param[14].Value = this.Idf_Usuario_Nivel;
            if (!string.IsNullOrEmpty(this.Des_Mensagem_Pessoal))
                param[15].Value = this.Des_Mensagem_Pessoal;
            else
                param[15].Value = DBNull.Value;
            

            string sQuery = string.Empty;

            if (this.Idf_Usuario.HasValue)
            {
                param[0].Value = this.Idf_Usuario.Value;
                
                sQuery = @"
                UPDATE Usuario SET Nme_Usuario = @Nme_Usuario,
                Des_Login = @Des_Login,
                Des_Senha = @Des_Senha,
                Flg_Masculino = @Flg_Masculino,
                Flg_Receber_Notificacao = @Flg_Receber_Notificacao,
                Dta_Nascimento = @Dta_Nascimento,
                Dta_Cadastro = @Dta_Cadastro,
                Dta_Alteracao = @Dta_Alteracao,
                Flg_Ativo = @Flg_Ativo,
                Qtd_Convites = @Qtd_Convites,
                Dta_Ultimo_Login = @Dta_Ultimo_Login,
                Num_Tema = @Num_Tema,
                Num_IP = @Num_IP,
                Idf_Usuario_Nivel = @Idf_Usuario_Nivel,
                Des_Mensagem_Pessoal = @Des_Mensagem_Pessoal
                WHERE Idf_Usuario = @Idf_Usuario
                ";

                DataAccessLayer.ExecuteNonQuery(System.Data.CommandType.Text, sQuery, param);
            }
            else
            {
                sQuery = @"INSERT INTO Usuario (Nme_Usuario,Des_Login,Des_Senha,Flg_Masculino,Flg_Receber_Notificacao,Dta_Nascimento,
                Dta_Cadastro,Dta_Alteracao,Flg_Ativo,Qtd_Convites,Dta_Ultimo_Login,Num_Tema,Num_IP,Idf_Usuario_Nivel, Des_Mensagem_Pessoal) VALUES 
                (@Nme_Usuario,@Des_Login,@Des_Senha,@Flg_Masculino,@Flg_Receber_Notificacao,@Dta_Nascimento,
                @Dta_Cadastro,@Dta_Alteracao,@Flg_Ativo,@Qtd_Convites,@Dta_Ultimo_Login,@Num_Tema,@Num_IP,@Idf_Usuario_Nivel,@Des_Mensagem_Pessoal)
                SELECT SCOPE_IDENTITY()";

                object id = DataAccessLayer.ExecuteScalar(System.Data.CommandType.Text, sQuery, param);
                this.Idf_Usuario = int.Parse(id.ToString());
            }


        }

        public static Usuario Carregar(int pIdUsuario)
        {
            List<SqlParameter> param = new List<SqlParameter>();
            param.Add(new SqlParameter("@Idf_Usuario", SqlDbType.Int));
            param[0].Value = pIdUsuario;

            string sQuery = @"SELECT * FROM Usuario WHERE Idf_Usuario = @Idf_Usuario";

            Usuario objUsuario = null;

            using (IDataReader iDr = DataAccessLayer.ExecuteReader(System.Data.CommandType.Text, sQuery, param))
            {
                if (iDr.Read())
                {
                    objUsuario = new Usuario();
                    objUsuario.Idf_Usuario = int.Parse(iDr["Idf_Usuario"].ToString());
                    objUsuario.Nme_Usuario = iDr["Nme_Usuario"].ToString();
                    objUsuario.Des_Login = iDr["Des_Login"].ToString();
                    objUsuario.Des_Senha = iDr["Des_Senha"].ToString();
                    objUsuario.Flg_Masculino = bool.Parse(iDr["Flg_Masculino"].ToString());
                    objUsuario.Flg_Receber_Notificacao = bool.Parse(iDr["Flg_Receber_Notificacao"].ToString());
                    objUsuario.Dta_Nascimento = DateTime.Parse(iDr["Dta_Nascimento"].ToString());
                    objUsuario.Dta_Cadastro = DateTime.Parse(iDr["Dta_Cadastro"].ToString());
                    objUsuario.Dta_Alteracao = DateTime.Parse(iDr["Dta_Alteracao"].ToString());
                    objUsuario.Flg_Ativo = bool.Parse(iDr["Flg_Ativo"].ToString());
                    objUsuario.Qtd_Convites = Int16.Parse(iDr["Qtd_Convites"].ToString());
                    objUsuario.Dta_Ultimo_Login = DateTime.Parse(iDr["Dta_Ultimo_Login"].ToString());
                    objUsuario.Num_Tema = Int16.Parse(iDr["Num_Tema"].ToString());
                    objUsuario.Num_IP = iDr["Num_IP"].ToString();
                    objUsuario.Idf_Usuario_Nivel = int.Parse(iDr["Idf_Usuario_Nivel"].ToString());
                    objUsuario.Des_Mensagem_Pessoal = iDr["Des_Mensagem_Pessoal"].Equals(DBNull.Value) ? string.Empty : iDr["Des_Mensagem_Pessoal"].ToString();
                }
            }

            return objUsuario;
        }

        public static Usuario Carregar(string pDesLogin, string pDesSenha)
        {
            List<SqlParameter> param = new List<SqlParameter>();
            param.Add(new SqlParameter("@Des_Login", SqlDbType.VarChar));
            param.Add(new SqlParameter("@Des_Senha", SqlDbType.VarChar));
            param[0].Value = pDesLogin;
            param[1].Value = MD5Hash(pDesSenha).ToLower().Replace("-","");

            string sQuery = @"SELECT TOP 1 * FROM Usuario WHERE Des_Login = @Des_Login AND Des_Senha = @Des_Senha";

            Usuario objUsuario = null;

            using (IDataReader iDr = DataAccessLayer.ExecuteReader(System.Data.CommandType.Text, sQuery, param))
            {
                if (iDr.Read())
                {
                    objUsuario = new Usuario();
                    objUsuario.Idf_Usuario = int.Parse(iDr["Idf_Usuario"].ToString());
                    objUsuario.Nme_Usuario = iDr["Nme_Usuario"].ToString();
                    objUsuario.Des_Login = iDr["Des_Login"].ToString();
                    objUsuario.Des_Senha = iDr["Des_Senha"].ToString();
                    objUsuario.Flg_Masculino = bool.Parse(iDr["Flg_Masculino"].ToString());
                    objUsuario.Flg_Receber_Notificacao = bool.Parse(iDr["Flg_Receber_Notificacao"].ToString());
                    objUsuario.Dta_Nascimento = DateTime.Parse(iDr["Dta_Nascimento"].ToString());
                    objUsuario.Dta_Cadastro = DateTime.Parse(iDr["Dta_Cadastro"].ToString());
                    objUsuario.Dta_Alteracao = DateTime.Parse(iDr["Dta_Alteracao"].ToString());
                    objUsuario.Flg_Ativo = bool.Parse(iDr["Flg_Ativo"].ToString());
                    objUsuario.Qtd_Convites = Int16.Parse(iDr["Qtd_Convites"].ToString());
                    objUsuario.Dta_Ultimo_Login = DateTime.Parse(iDr["Dta_Ultimo_Login"].ToString());
                    objUsuario.Num_Tema = Int16.Parse(iDr["Num_Tema"].ToString());
                    objUsuario.Num_IP = iDr["Num_IP"].ToString();
                    objUsuario.Idf_Usuario_Nivel = int.Parse(iDr["Idf_Usuario_Nivel"].ToString());
                    objUsuario.Des_Mensagem_Pessoal = iDr["Des_Mensagem_Pessoal"].Equals(DBNull.Value) ? string.Empty : iDr["Des_Mensagem_Pessoal"].ToString();
                }
            }

            return objUsuario;
        }

        public static void SalvarMensagemPessoal(string pDesMensagemPessoal, string pIdfUsuario)
        {
            List<SqlParameter> param = new List<SqlParameter>();
            param.Add(new SqlParameter("@Idf_Usuario", SqlDbType.Int));
            param.Add(new SqlParameter("@Des_Mensagem_Pessoal", SqlDbType.VarChar));
            param[0].Value = pIdfUsuario;
            param[0].Value = pDesMensagemPessoal;

            string sQuery = @"UPDATE Usuario SET Des_Mensagem_Pessoal = @Des_Mensagem_Pessoal WHERE Idf_Usuario = @Idf_Usuario";

            DataAccessLayer.ExecuteNonQuery(System.Data.CommandType.Text, sQuery, param);
        }

        public static bool EmailCadastrado(string pDesLogin)
        {
            List<SqlParameter> param = new List<SqlParameter>();
            param.Add(new SqlParameter("@Des_Login", SqlDbType.VarChar));
            param[0].Value = pDesLogin;

            string sQuery = @"SELECT * FROM Usuario WITH(NOLOCK) WHERE Des_Login = @Des_Login";

            bool bCadastrado = false;
            using (IDataReader iDr = DataAccessLayer.ExecuteReader(System.Data.CommandType.Text, sQuery, param))
            {
                if (iDr.Read())
                    bCadastrado = true;
            }

            return bCadastrado;
        }

        public static bool NomeCadastrado(string pNmeUsuario)
        {
            List<SqlParameter> param = new List<SqlParameter>();
            param.Add(new SqlParameter("@Nme_Usuario", SqlDbType.VarChar));
            param[0].Value = pNmeUsuario;

            string sQuery = @"SELECT * FROM Usuario WITH(NOLOCK) WHERE Nme_Usuario = @Nme_Usuario";

            bool bCadastrado = false;
            using (IDataReader iDr = DataAccessLayer.ExecuteReader(System.Data.CommandType.Text, sQuery, param))
            {
                if (iDr.Read())
                    bCadastrado = true;
            }

            return bCadastrado;
        }

        public static string MD5Hash(string sTexto)
        {
            MD5 HashMD5 = MD5.Create();
            byte[] iBytes = System.Text.Encoding.ASCII.GetBytes(sTexto+"chaveotzee123456#$");
            byte[] hash = HashMD5.ComputeHash(iBytes);

            return BitConverter.ToString(hash);
        }
    }
}
